package org.hfy.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 报价单状态枚举
 * 修改后支持严格的业务流程：
 * 草稿 -> 已提交 -> 已生成合同 -> 合同审核通过 -> 外发加工中 -> 已入库
 */
@Getter
@AllArgsConstructor
public enum QuotationStatus {
    DRAFT("草稿", "草稿"),
    SUBMITTED("已提交", "已提交"),
    CONTRACT_GENERATED("已生成合同", "已生成合同"),
    CONTRACT_APPROVED("合同审核通过", "合同审核通过"),
    OUTSOURCING("外发加工中", "外发加工中"),
    WAREHOUSED("已入库", "已入库"),
    CONTRACT_REJECTED("合同审核拒绝", "合同审核拒绝");

    private final String code;
    private final String description;

    public static QuotationStatus fromCode(String code) {
        for (QuotationStatus status : values()) {
            if (status.getCode().equals(code)) {
                return status;
            }
        }
        return DRAFT; // 默认返回草稿状态
    }
    
    /**
     * 判断是否可以生成合同
     * 在合同被审核之前，均可以重新生成合同
     */
    public boolean canGenerateContract() {
        return this == SUBMITTED || this == CONTRACT_GENERATED;
    }
    
    /**
     * 判断是否可以外发加工
     * 合同审核通过后都可以外发加工，包括外发加工中和已入库状态
     * 因为一个报价单有多个物料，可能需要多次外发加工
     */
    public boolean canOutsource() {
        return this == CONTRACT_APPROVED || this == OUTSOURCING || this == WAREHOUSED;
    }
    
    /**
     * 判断是否可以入库
     */
    public boolean canWarehouse() {
        return this == OUTSOURCING;
    }
    
    /**
     * 判断是否可以编辑
     * 在合同被审核之前，均可以编辑报价单
     */
    public boolean canEdit() {
        return this == DRAFT || this == SUBMITTED || this == CONTRACT_GENERATED;
    }
    
    /**
     * 判断是否可以删除
     * 所有状态均可删除，但前端会给出相应警告
     */
    public boolean canDelete() {
        return true;
    }
} 